home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / conhlp03 / padp_src / ppgdisp.c < prev    next >
C/C++ Source or Header  |  1995-02-20  |  4KB  |  192 lines

  1. /*
  2.     ppgdisp.c
  3.     tab=8
  4.     1994/11/24 padpage.c より分割
  5.     1994/11/27 ファイル読み込みを分割
  6.     1994/11/28
  7.     1995/02/19
  8. */
  9.  
  10. #define PPGDISP
  11. #include "padpage.h"
  12.  
  13. /* sjis 上位:81h-9fh e0h-efh 下位:3fh-fbh !7fh */
  14. #define isk1(c) ( 0x81<=(c) && (c)<=0x9f || 0xe0<=(c) && (c)<=0xef )
  15. #define isk2(c) ( 0x3f<=(c) && (c)<=0xfb && (c) != 0x7f )
  16. #define isck(x,c) (x==0)?(isk1(c)?1:0):(x==1)?2:(x==2)?(isk1(c)?1:0):0;
  17.  
  18. #define ENDLINE 27
  19.  
  20. static int linep[MAXLINE];            /* 行ポインタ */
  21. static byte rlinebuf[21][200];            /* 表示用ラインバッファ */
  22.  
  23.  
  24. int setline( int ls ){    /* 表示バッファセット */
  25.  
  26.     static int lb = 0;    /* 前回のls , lc 終了値 */
  27.     static int ll = 0;    /* 最終行 */
  28.     byte k1 = 0;        /* 文字種 */
  29.     int cc = 0;        /* カウンタ */
  30.     int lc,clm,fl;
  31.     byte *lp,c,crf;
  32.  
  33.     if( mp_eof && ls >= ll ) return( ll );
  34.     if( ls == 0 || lb == ls ) return( ll );
  35.     if( ls < 0 ){            /* 再初期化 */
  36.         lb = ll = 0;
  37.         mp_eof = 0;
  38.     }
  39. /*     mp_eof = 0; */
  40.     if( lb == 0 ){
  41.         ls = 1;
  42.         linep[ls] = 0;
  43.     }
  44.     if( lb < ls ){ /* ↓ */
  45.         if( lb == 0 ) lc = ls;
  46.         else lc = ( ls - lb ) > maxdisp ? ls : lb + maxdisp ;
  47.         lb = ls + maxdisp;
  48.         if( lc < ll ){
  49.             cc = linep[lc];
  50.         } else {
  51.             cc = linep[ll];
  52.         }
  53.     }else{ /* ↑ */
  54.         cc = linep[ls];
  55.         lc = ls;
  56.         lb = (( lb - ls ) > maxdisp ) ? ls + maxdisp : lb ;
  57.     }
  58.     clm = 0;
  59.     lp = rlinebuf[ lc % maxdisp ];
  60.     while( lc < lb ){
  61.         if( lc >= MAXLINE ){
  62.             mp_eof = 4;        /* ラインオーバー */
  63.             break;
  64.         }
  65.         /* バッファから1文字コピー */
  66.         if( ( fl = getbuff( fp,cc++,&c ) ) != NULL ) {
  67.             mp_eof = fl;
  68.             *(lp + clm) = NULL;
  69.             *rlinebuf[(lc+1) % maxdisp] = ENDLINE;
  70.             linep[lc+1] = cc;
  71.             ll = lc;
  72.             break;
  73.         }
  74.         k1 = isck(k1,c); /* 文字種判定 */
  75.         switch ( c ) {
  76.         case '\t' :
  77.         /* タブの展開 */
  78.             do{
  79.                 *(lp + clm++) = ' ';
  80.                 if( clm > MAXCLM ){
  81.                     crf = ON;
  82.                     break;
  83.                 }
  84.             } while( ( clm % tabs ) != 0 );
  85.             break;
  86.         case '\33' :
  87.         /* エスケープシーケンス */
  88.             *(lp + clm++) = ' ';
  89.             break;
  90.         case '\r' :
  91.             *(lp + clm++) = NULL;
  92.             if( clm < MAXCLM ) crf = ON;
  93.         case '\n' :
  94.         case 0x7f :
  95.         case 0xff :
  96.             break;
  97.         default:
  98.             if( c < ' ' ) break;
  99.             /* 2バイト文字行端処理 */
  100.             if( clm == MAXCLM && k1 == 1 ){
  101.                 cc--;
  102.                 crf = ON;
  103.                 break;
  104.             }
  105.             *(lp + clm++) = c;
  106.         }
  107.         if( clm > MAXCLM ) crf = ON;
  108.         if( crf == ON ){
  109.             crf = OFF;
  110.             *(lp + clm) = NULL;
  111.             clm = 0;
  112.             lp = rlinebuf[(++lc) % maxdisp];
  113.             if( lc > ll ){
  114.                 ll = lc;
  115.                 linep[lc] = cc;
  116.             }else{
  117.                 cc = linep[lc];
  118.             }
  119.         }
  120.     }
  121.     lb = ls;
  122.     /* 戻り値は最終行 */
  123.     return( ll );
  124. }
  125.  
  126.  
  127. int dsppage( int ls, int ll ){    /* 1ページ表示 */
  128.  
  129.     static const char *footmes[] = {    /* フットメッセージ */
  130.         " --- EOF --- ",
  131.         " --- MEMORY FULL --- ",
  132.         " --- BUFFUR FULL --- ",
  133.         " --- LINE OVER --- "
  134.     };
  135.     static int lb = 0 ;
  136.     int i,f;
  137.  
  138.     if( ll > 0 ){ /* ll <= 0 再表示 */
  139.         /* line no. 表示 */
  140.         cprintf(ESCSQU"1;65H"ESC_SB" line %4d/%4d "ESC_reset,ls,ll-1);
  141.         if( lb == ls || ls < 1 || ll <= ls ) return ls ;
  142.     }
  143.     lb = ls;
  144.     for( i = ls ; f = ( i < ( ls + maxdisp )) ; i++ ){
  145.     /* 1行表示 */
  146.         if( *rlinebuf[i % maxdisp] == ENDLINE ){
  147.             cprintf(ESCSQU"%d;1H"ESC_el0, ((i-ls) % maxdisp)+3);
  148.             break;
  149.         }
  150.         cprintf( ESCSQU"%d;1H%s"ESC_el0,
  151.             ((i-ls) % maxdisp)+3, rlinebuf[i % maxdisp]);
  152.     }
  153.     /* foot disp */
  154.     if( f ){ /* break ? */
  155.         i = (i-ls) % maxdisp + 3;
  156.         cprintf( ESCSQU"%d;1H"ESC_SBr"%s"ESC_reset ESC_clr0,
  157.             i , footmes[mp_eof-1]);
  158.     }
  159.     return( ls );
  160.  
  161. }
  162.  
  163.  
  164. int ppgscroll( char a, int s ){    /* auto scroll */
  165.         
  166.     static const char *ar[2] = { "↑↑↑","↓↓↓" };
  167.     int i,d,rr = 0;
  168.     int l,ll=1;
  169.  
  170.     if( a == '+' ){
  171.         i = 0; d = 1;
  172.     }else
  173.     if( a == '-' ){
  174.         i = 1; d = -1;
  175.     }else
  176.         return s;
  177.  
  178.     cprintf( ESCSQU"2;30H"ESC_BLi"%s scroll %s"ESC_reset,ar[i],ar[i]);
  179.     for( i = s ; i > 0 ; i += d ){
  180.         rr = dsppage( i,l = setline( i ) );
  181.         if( inkey() != NULL ) break;
  182.         if( mp_eof == NULL ){
  183.             ll = setline( ( ll < l ) ? l : ll );
  184.         } /* else {
  185.             if( mp_eof && rr > ll ) break;
  186.         } */
  187.         wait(sclw);
  188.     }
  189.     cputs( ESCSQU"2;1H"ESC_el0 );
  190.     return ( i + d );            /* 終了時の表示開始行 */
  191. }
  192.